/**
  * *********************************************
  * 重要：数据必须 排序
  * *********************************************
 * 合并分页浏览记录数据，按指定规则分组，并将指定字段提升至分组层级
 *
 * @param {Array} oldGroupedList - 已有的分组数据（用于分页追加）
 * @param {Array} newList - 当前页返回的新数据列表
 * @param {Array<string>} [promoteFields=[]] - 需要从 items 中提升到分组层级的字段名数组
 * @param {string | Function} [groupByKey] - 分组依据：
 *        - 若为字符串（如 'dictCode'）：按该字段值分组
 *        - 若为函数 (item) => key：按返回值分组
 *        - 若未传或为 null：按 browseTime 的“日期”分组（默认行为）
 * @return {Array} 合并后的分组数据
 */
function mergeBrowseRecordsByDate(
  oldGroupedList,
  newList,
  promoteFields = [],
  groupByKey = null
) {
  if (!Array.isArray(oldGroupedList)) oldGroupedList = [];
  if (!Array.isArray(newList)) newList = [];

  const mergedList = [...oldGroupedList];

  // 构建已有分组的 key -> group 映射（用于快速查找）
  const groupMap = new Map();
  if (groupByKey !== null) {
    // 自定义分组：建立 key -> group 映射
    for (const group of mergedList) {
      const key = typeof groupByKey === 'function'
        ? groupByKey(group.items[0]) // 用第一条记录生成 key
        : group[groupByKey];         // 直接取 group 上的字段（需确保已存在）
      if (key !== undefined && key !== null) {
        groupMap.set(String(key), group);
      }
    }
  }

  for (const item of newList) {
    const cleanItem = { ...item, checked: false };
    promoteFields.forEach(field => {
      delete cleanItem[field];
    });

    let targetGroup = null;

    if (groupByKey === null) {
      // ========== 默认：按日期分组 ==========
      const browseTime = item.browseTime || Date.now();
      const dateLabel = item.browseTimeString || formatDefaultDate(browseTime);

      const lastGroup = mergedList[mergedList.length - 1];
      const isSameGroup =
        lastGroup &&
        lastGroup.items.length > 0 &&
        isSameDay(browseTime, lastGroup.items[lastGroup.items.length - 1].browseTime);

      if (isSameGroup) {
        targetGroup = lastGroup;
      } else {
        targetGroup = {
          dateLabel,
          groupChecked: false,
          items: [],
        };
        // 提升字段
        promoteFields.forEach(field => {
          if (item.hasOwnProperty(field)) {
            targetGroup[field] = item[field];
          }
        });
        mergedList.push(targetGroup);
      }
    } else {
      // ========== 自定义分组逻辑 ==========
      const key = typeof groupByKey === 'function'
        ? groupByKey(item)
        : item[groupByKey];

      if (key === undefined || key === null) {
        // 无法分组的项，可选择跳过或归入默认组（这里归入新组）
        targetGroup = {
          [typeof groupByKey === 'string' ? groupByKey : 'customGroupKey']: key,
          groupChecked: false,
          items: [],
        };
        promoteFields.forEach(field => {
          if (item.hasOwnProperty(field)) {
            targetGroup[field] = item[field];
          }
        });
        mergedList.push(targetGroup);
      } else {
        const keyStr = String(key);
        if (groupMap.has(keyStr)) {
          targetGroup = groupMap.get(keyStr);
        } else {
          targetGroup = {
            ...(typeof groupByKey === 'string' && { [groupByKey]: key }),
            groupChecked: false,
            items: [],
          };
          // 提升字段（取当前 item 的值）
          promoteFields.forEach(field => {
            if (item.hasOwnProperty(field)) {
              targetGroup[field] = item[field];
            }
          });
          mergedList.push(targetGroup);
          groupMap.set(keyStr, targetGroup);
        }
      }
    }

    targetGroup.items.push(cleanItem);
  }

  return mergedList;
}

// -------------------------------
// 辅助函数：判断两个时间戳是否为同一天
// -------------------------------
function isSameDay(timestamp1, timestamp2) {
  const date1 = new Date(Number(timestamp1));
  const date2 = new Date(Number(timestamp2));
  return (
    date1.getFullYear() === date2.getFullYear() &&
    date1.getMonth() === date2.getMonth() &&
    date1.getDate() === date2.getDate()
  );
}

// -------------------------------
// 辅助函数：默认格式化时间为 YYYY-MM-DD
// -------------------------------
function formatDefaultDate(timestamp) {
  const date = new Date(Number(timestamp));
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');
  return `${year}-${month}-${day}`;
}

export { mergeBrowseRecordsByDate };